/**
 * 购物车管理类
 * 业务层级：业务逻辑层
 * 功能说明：管理购物车商品的添加、删除、修改和计算，支持折扣处理和订单转换
 * 架构关系：遵循四层架构设计，为收银和订单处理提供购物车数据管理服务
 */
#ifndef SHOPPINGCART_H
#define SHOPPINGCART_H

#include <QObject>
#include <QVector>
#include <QMap>
#include <QVariant>
#include "order.h"

// 购物车项结构
struct CartItem {
    int productId;
    QString productCode;
    QString productName;
    QString specification;
    double price;
    int quantity;
    double subtotal;
    bool allowDiscount;

    CartItem() : productId(0), price(0.0), quantity(0), subtotal(0.0), allowDiscount(true) {}
    CartItem(int id, const QString& code, const QString& name, const QString& spec,
             double p, int qty, bool discount)
        : productId(id), productCode(code), productName(name), specification(spec),
          price(p), quantity(qty), subtotal(p * qty), allowDiscount(discount) {}
};

// 购物车摘要信息
struct CartSummary {
    int itemCount;
    int totalQuantity;
    double subtotal;
    double discount;
    double total;

    CartSummary() : itemCount(0), totalQuantity(0), subtotal(0.0), discount(0.0), total(0.0) {}
};

class ShoppingCart : public QObject
{
    Q_OBJECT

public:
    explicit ShoppingCart(QObject *parent = nullptr);

    // 添加商品到购物车
    bool addProduct(int productId, const QString& productCode, const QString& productName,
                   const QString& specification, double price, int quantity = 1, bool allowDiscount = true);

    // 移除商品
    bool removeProduct(int productId);

    // 修改商品数量
    bool updateQuantity(int productId, int newQuantity);

    // 清空购物车
    void clear();

    // 重置购物车（保留折扣设置）
    void reset();

    // 获取购物车中的所有商品
    QVector<CartItem> getItems() const;

    // 获取购物车中的商品数量
    int getItemCount() const;

    // 获取购物车中的商品总数量
    int getTotalQuantity() const;

    // 计算折前总金额
    double calculateSubtotal() const;

    // 应用会员折扣
    double applyDiscount(double discountRate);

    // 设置折扣率
    void setDiscountRate(double rate);

    // 获取折扣率
    double getDiscountRate() const;

    // 获取折后总金额
    double getTotal() const;

    // 获取折扣金额
    double getDiscountAmount() const;

    // 检查购物车是否为空
    bool isEmpty() const;

    // 查找购物车中的商品
    CartItem findItem(int productId) const;

    // 查找购物车中的商品（通过编码）
    CartItem findItemByCode(const QString& productCode) const;

    // 转换为订单详情
    QVector<OrderDetail> toOrderDetails() const;

    // 获取购物车摘要信息
    CartSummary getSummary() const;

signals:
    // 购物车变化信号
    void cartUpdated();
    void itemAdded(const CartItem& item);
    void itemRemoved(int productId);
    void quantityUpdated(int productId, int newQuantity);

private:
    QVector<CartItem> m_items;
    double m_discountRate;
    double m_discountAmount;
    double m_totalAmount;
};

#endif // SHOPPINGCART_H
